import java.util.HashMap;
import java.util.Map;

public class DAY0418 {
    //剑指 Offer 20. 表示数值的字符串
    public boolean isNumber(String s) {
        //是否有数字：hasNum
        //是否有e：hasE
        //是否有正负符号：hasSign
        //是否有点：hasDot
        // 字符串长度n
        // 字符串索引index
        int n = s.length();
        int index = 0;
        boolean hasNum = false, hasE = false;
        boolean hasSign = false, hasDot = false;

        while(index < n && s.charAt(index) == ' ')
            index++;//让索引到达开头不是空格的位置

        while(index < n){
            while(index < n && s.charAt(index) >= '0' && s.charAt(index) <= '9'){
                index++;
                hasNum = true;
            }//是否是数字

            if(index == n){
                break;
            }//已遍历到末尾(index == n)，结束循环

            char c = s.charAt(index);
            if(c == 'e' || c == 'E'){
                if(hasE || !hasNum){
                    return false;
                }//如果e已经出现或者当前e之前没有出现过数字，返回fasle

                //令hasE = true，并且将其他3个flag全部置为false，因为要开始遍历e后面的新数字了
                hasE = true;
                hasNum = false; hasSign = false; hasDot = false;
            }else if(c == '+' || c == '-'){
                if(hasSign || hasNum || hasDot){
                    return false;
                }//如果已经出现过+或-或者已经出现过数字或者已经出现过'.'，返回flase
                hasSign = true;//
            }else if(c == '.'){
                if(hasDot || hasE){
                    return false;
                }//当前字符c是'.'：如果已经出现过'.'或者已经出现过'e'或'E'，返回false
                hasDot = true;
            }else if(c == ' '){
                break;//如果当前字符c是' '：结束循环，因为可能是末尾的空格了，但也有可能是字符串中间的空格，在循环外继续处理
            }else{
                return false;
            }
            index++;
        }

        while(index < n && s.charAt(index) == ' ')
            index++;//处理空格，index相应的后移

        return hasNum && index == n;//如果当前索引index与字符串长度相等，说明遍历到了末尾，但是还要满足hasNum为true才可以最终返回true
    }

    //剑指 Offer 05. 替换空格
    public String replaceSpace(String s) {
        //请实现一个函数，把字符串 s 中的每个空格替换成"%20"。
        char[] l = new char[(s.length())*3];
        int n=0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == ' '){
                l[n++] = '%' ;
                l[n++] = '2' ;
                l[n++] = '0' ;
            }else {
                l[n++] = c ;
            }
        }
        String str = new String(l ,0 ,n );
        return str;
    }


    //剑指 Offer 58 - II. 左旋转字符串
    //字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
    // 比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }


    //剑指 Offer 67. 把字符串转换成整数
    //写一个函数 StrToInt，实现把字符串转换成整数这个功能。
    public int strToInt(String str) {
        char[] c = str.trim().toCharArray();
        if(c.length == 0){
            return 0;
        }
        int nums = 0;
        int bndry= Integer.MAX_VALUE / 10;
        int i = 1;
        int sign = 1;
        if(c[0] == '-') {
            sign = -1;
        }else if(c[0] != '+'){
            i = 0;
        }

        for(int j = i; j < c.length; j++) {
            if(c[j] < '0' || c[j] > '9') break;
            if(nums > bndry || nums == bndry && c[j] > '7'){
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            nums = nums * 10 + (c[j] - '0');
        }
        return sign * nums;
    }
}
